Skip to content

fix(ci): remove the unrunnable SonarCloud step breaking Governance + CodeQL - #139

Merged
hyperpolymath merged 1 commit into
mainfrom
fix/remove-broken-sonar-step
Jul 27, 2026
Merged

fix(ci): remove the unrunnable SonarCloud step breaking Governance + CodeQL#139
hyperpolymath merged 1 commit into
mainfrom
fix/remove-broken-sonar-step

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

What

Removes SonarSource/sonarqube-scan-action@master from four workflows. This single unpinned action is the sole cause of both remaining red checks on main.

Why both checks are red

Check Error
governance / Workflow security linter ERROR: Found unpinned actions:
.github/workflows/codeql.yml:58: uses: SonarSource/sonarqube-scan-action@master
CodeQL Security Analysis ##[error]The action sonarsource/sonarqube-scan-action@master is not allowed in hyperpolymath/maa-framework because all actions must be pinned to a full-length commit SHA.

The CodeQL one is a startup rejection by the org ruleset — the analyze job died with zero steps executed. No lint-shaped error, and nothing useful in gh pr checks.

Why removed, not pinned

Pinning alone cannot make this step work. Measured:

  • No SONAR_TOKEN secret on this repo (gh secret list — 8 secrets, none is Sonar)
  • No sonar config anywhere in the tree (git ls-tree -r origin/main | grep -i sonar → empty)
  • No with: or env: on the step, so no project key and no organization
  • It was appended inside the CodeQL matrix job, so it would run once per language
  • In two files it was jammed between a step and the next job key with no blank line

Pinning would have swapped a pinning error for an auth error and left main red.

Scope

File Status
.github/workflows/codeql.yml live — this is the one breaking CI
aletheia/.github/workflows/codeql.yml inert
aletheia/.github/workflows/rust-ci.yml inert
aletheia/extraction/rhodibot/.github/workflows/ci.yml inert

The three aletheia/ copies are inert because Actions reads .github/workflows/ at the repository root only — that subtree has never executed. They are removed anyway so the defect cannot return the moment anyone promotes one of those files to the root. Trailing newlines the sweep dropped are also restored.

Verification

  • All four files parse — yq eval '.jobs | keys'
  • Job keys intact — test,security,coverage and check,test,build,self-verify
  • Governance linter replicated locally: All actions are SHA-pinned + All workflows have SPDX headers + permissions

Adopting SonarCloud properly later

One root workflow only, pinned to a SHA, with SONAR_TOKEN wired and a sonar-project.properties committed. Note the estate finding that a minted repo's sonar.projectKey can still point at the template's Sonar project.

Not in this PR

🤖 Generated with Claude Code

…CodeQL

`SonarSource/sonarqube-scan-action@master` was appended to four workflows by
a sweep. The root copy is live and breaks CI two different ways:

  - governance / Workflow security linter
      ERROR: Found unpinned actions:
      .github/workflows/codeql.yml:58: uses: SonarSource/sonarqube-scan-action@master

  - CodeQL Security Analysis
      ##[error]The action sonarsource/sonarqube-scan-action@master is not
      allowed in hyperpolymath/maa-framework because all actions must be
      pinned to a full-length commit SHA.

The second is a *startup* rejection by the org ruleset, so the analyze job
died with zero steps — no lint-shaped error, and no check run to inspect.

Removed rather than pinned, because pinning alone cannot make it work:

  - no `SONAR_TOKEN` secret exists on this repo (verified via `gh secret list`)
  - no sonar-project.properties / sonar config anywhere in the tree
  - the step carries no `with:` or `env:`, so it has no project key or org
  - it was appended *inside the CodeQL matrix job*, so it would run once per
    language, and in two files it was jammed between a step and the next job
    key with no blank line

Pinning it would have swapped a pin error for an auth error and left main red.

Also removes the three copies under aletheia/ — those workflows are inert
(Actions reads .github/workflows/ at the repo root only), but leaving them
would re-introduce the defect the moment anyone promotes one to the root.
Restores the trailing newlines the sweep dropped.

To adopt SonarCloud properly later: one root workflow only, pinned to a SHA,
with SONAR_TOKEN wired and a sonar-project.properties committed.

Verified: all four files parse (`yq`); job keys intact (test/security/coverage,
check/test/build/self-verify); both governance linter checks pass locally.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@hyperpolymath
hyperpolymath marked this pull request as ready for review July 27, 2026 13:32
@hyperpolymath
hyperpolymath merged commit f508c03 into main Jul 27, 2026
23 of 25 checks passed
@hyperpolymath
hyperpolymath deleted the fix/remove-broken-sonar-step branch July 27, 2026 13:32
hyperpolymath added a commit that referenced this pull request Jul 28, 2026
…ch the code (#144)

Three independent commits, each droppable on its own. Two fix gates that
could never fail; one fixes documentation that actively misdirects.

---

## 1. `docs:` — two files misstate the code they describe

### `PROOF-NEEDS.md`

Claimed *"1 `Admitted` in `proofs/coq/lambda/LambdaCNO.v` (y_not_cno)"*.
Measured against `absolute-zero 87902bb7`:

```
$ grep -rn "Admitted" absolute-zero --include=*.v | wc -l
0
$ grep -rn "^Axiom"  absolute-zero --include=*.v | wc -l
23
```

**Zero `Admitted`. Twenty-three `Axiom`s across 6 files.** The old
wording was wrong in *both* directions — it overstated the
incompleteness and understated the trusted base 23×.

> **Why this matters operationally:** an `Axiom` **passes** a "no
`sorry` / no `Admitted`" gate silently. Counting only `Admitted`
measures the wrong thing.

`y_not_cno` is a **KEPT AXIOM** with a written rationale
(`LambdaCNO.v:388-399`), not an unproven hole — and it is *not* the
"concrete, closable proof obligation" the old text claimed. The
in-source note explains it needs an invariant closed under the full
reduction congruence, or a coinductive/step-indexed argument.

The doc now defers to the **AXIOM AUDIT** already in
`physics/LandauerDerivation.v`, which is notably self-critical — it
records that `cno_zero_energy_dissipation_derived` is an axiom *despite
its `_derived` name*, and that the triage docs' "DISCHARGE" marks are
inaccurate.

**Promoted to the top of "What Needs Proving"** — the audit's own
SOUNDNESS WARNINGS: `prob_nonneg` and `prob_normalized` are false over
unconstrained function-type distributions, and
`shannon_entropy_maximum`'s inequality is **backwards** (asserts uniform
*minimises* entropy). All three are currently **unused** — cheap now,
expensive later.

### `aletheia/CLAUDE.md`

Said *"all core logic lives in `src/main.rs` (~950 lines)"* and *"don't
split into modules unless >1000 lines"*. It has been **5 modules / 995
lines** for a while, `main.rs` at 121. That instruction would tell the
next agent to **undo the existing structure**.

Also corrected: 23 workflows → 16; `flake.nix` listed but absent; 18
integration tests → 32. Added a prominent warning that those 16 nested
workflows have **never run** (root-only discovery) — the fault that let
this crate stay uncompilable for a month.

---

## 2. `fix(aletheia):` — the SHA-pinning check could never fail

```rust
if line.contains("@v") && !line.contains("@") {
```

`contains("@v")` **implies** `contains("@")`, so the second clause is
always false and `has_unpinned` could never be set. Proven before
changing anything:

```
uses: actions/checkout@v4    old_detects_unpinned=false
```

This is aletheia's Silver-level *"GitHub Actions SHA pinning"* check —
and pointedly, the exact check that would have caught
`SonarSource/sonarqube-scan-action@master`, the unpinned action that
broke this repo's Governance and CodeQL in #139.

Replaced with `uses_line_is_pinned`, requiring 40 hex chars after the
final `@`, which also:
- accepts the inline `- uses:` form (the estate's existing linter
anchors to line-start and misses it)
- ignores a trailing `# v7.0.1` provenance comment, so a correct pin
with a stale comment isn't a false positive
- exempts `./…` local actions/reusables and `docker://` refs

Also replaced `assert!(true)` in `test_file_exists` with a real
assertion, anchored on `env!("CARGO_MANIFEST_DIR")` so it is
deterministic regardless of CWD.

**Verified:** 29 unit tests (was 26) · `cargo fmt --check` clean ·
clippy 25 → 23. End-to-end `cargo run -- .` now reports `[FAIL] GitHub
Actions SHA pinning`, correctly finding the one genuinely unpinned
action — where before the fix it reported a pass.

Refs #125.

---

## 3. `fix(#99):` — root `Justfile` was a fake gate

```make
build:
    @echo "Build not configured yet"
```

`build`, `test`, `fmt`, `lint`, `clean` all printed a string and
**exited 0**. Wired to the same commands root `rust-ci.yml` runs, in the
same order, so `just check` means what CI means.

Two deliberate limits, documented **in the recipes** so nobody "fixes"
them:
- `test` is `--bins` only — the integration suite is a spec for a CLI
that doesn't exist; 27/29 fail by design (#124). Adding `--tests` would
make the bar green by breaking it.
- `lint` is not yet `-D warnings` (#125). When that closes it must be
added **here and to `rust-ci.yml` together**, so local and CI never
disagree.

**Verified by running them, not reading them:** `just deps-check` → `OK:
zero dependencies`; `just test` → 29 passed; `just check` → exit 0.

**And verified the gate can actually fail** — appending badly-formatted
Rust makes `just fmt` exit 1 while `just build` still exits 0; reverting
restores 0. A gate nobody has watched fail is not a gate.

Closes #99.

---

## Not in this PR

- **#124** — still blocked on the source-of-truth question for RSR
checks
- **`guix.scm`** identity/licence clobber — separate, more urgent: #143

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant